package main

import "fmt"

// 这个是切片
func updateSlice(s []int) {
	s[0] = 100
}

func main() {
	// 切片          0  1  2  3  4  5  6  7  8  9
	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
	s := arr[2:6]
	fmt.Println("arr[2:6]", s)      // [2,3,4,5]
	fmt.Println("arr[:6]", arr[:6]) // [0,1,2,3,4,5]
	fmt.Println("arr[2:]", arr[2:]) // [2 3 4 5 6 7 8 9]
	fmt.Println("arr[:]", arr[:])   // [0 1 2 3 4 5 6 7 8 9]

	s1 := arr[2:]
	fmt.Println("s1=", s1)

	s2 := arr[:] // 这个是数组  (整个)
	fmt.Println("s2=", s2)

	fmt.Println("After updateSlice(s1)")
	updateSlice(s1)
	fmt.Println(s1)  // [0 1 2 3 4 5 6 7 8 9]
	fmt.Println(arr) // [0 1 100 3 4 5 6 7 8 9]
	fmt.Println("After updateSlice(s2)")
	updateSlice(s2)
	fmt.Println(s2)  // [100 1 100 3 4 5 6 7 8 9]
	fmt.Println(arr) // [100 1 100 3 4 5 6 7 8 9]

	fmt.Println("Reslice")
	fmt.Println(s2) // [100 1 100 3 4 5 6 7 8 9]
	s2 = s2[:5]
	fmt.Println(s2) // [100 1 100 3 4]
	s2 = s2[2:]
	fmt.Println(s2) // [100 3 4]

	// Slice 扩展
	fmt.Println("Extending Slice!")
	arr1 := []int{0, 1, 2, 3, 4, 5, 6, 7}
	fmt.Println(arr1)                                                         // [0, 1, 2, 3, 4, 5, 6, 7]
	ss1 := arr1[2:6]                                                          //       [2, 3, 4, 5]     下标
	ss2 := ss1[3:5]                                                           //                [5, 6]  下标
	fmt.Printf("ss1=%v, len(ss1)=%d, cap(ss1)=%d\n", ss1, len(ss1), cap(ss1)) //  [2, 3, 4, 5]
	fmt.Printf("ss2=%v, len(ss2)=%d, cap(ss2)=%d\n", ss2, len(ss2), cap(ss2)) //  [5, 6]       slice可以向后扩展，不可以向前扩展    s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)
	fmt.Println(ss1[3:6])
}
